package com.itheima.web.manager;

import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.itheima.domain.db.Admin;
import com.itheima.exception.BusinessException;
import com.itheima.service.db.AdminService;
import com.itheima.util.ConstantUtil;
import com.itheima.util.JwtUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

@Component
public class AdminManager {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @DubboReference
    private AdminService adminService;
    //生成验证码
    public LineCaptcha verification(String uuid) {
        //创建生成验证码的工具类 设置宽300 高100
        LineCaptcha lineCaptcha=new LineCaptcha(300,100);
        //在redis里存入验证码信息 有效期5分钟
        stringRedisTemplate.opsForValue().set(ConstantUtil.ADMIN_CODE+uuid,lineCaptcha.getCode(), Duration.ofMinutes(5));
        //返回验证码
        return lineCaptcha;
    }
    //登录
    public ResponseEntity login(String username, String password, String code, String uuid) {
        //取出redis里存入的验证码
        String redisCode = stringRedisTemplate.opsForValue().get(ConstantUtil.ADMIN_CODE+uuid);
        //如果验证码不相同 返回错误信息
        if (!redisCode.equalsIgnoreCase(code)){
            throw new BusinessException("验证码错误");
        }
        //根据用户名查询用户详情
        Admin admin = adminService.findAdminByUsername(username);
        //如果为空 返回错误信息
        if (admin==null){
            throw new BusinessException("用户名不存在");
        }
        //因为数据存入前密码会加密 需要把用户输入的密码先加密后在对比
        String pwd = SecureUtil.md5(password);
        //密码不对的话 返回错误信息
        if (!admin.getPassword().equals(pwd)){
            throw new BusinessException("密码错误");
        }
        //走到这里 代表信息都正确 把存入的验证码删除
        stringRedisTemplate.delete(ConstantUtil.ADMIN_CODE+uuid);
        //把管理员信息转成json 前把密码置为null
        admin.setPassword(null);
        //把管理员信息转成map
        Map<String, Object> map = BeanUtil.beanToMap(admin);
        //调用工具类生成令牌
        String token = JwtUtil.createToken(map);
        //把管理员信息转为json
        String json = JSON.toJSONString(admin);
        //存入redis里 有效期1小时
        stringRedisTemplate.opsForValue().set(ConstantUtil.ADMIN_TOKEN+token,json,Duration.ofHours(1));
        //创建map 传入返回值
        Map<String ,String> resultMap=new HashMap<>();
        resultMap.put("token",token);
        //返回页面
        return ResponseEntity.ok(resultMap);
    }
    //取消登录
    public void logout(String token) {
        //因前端原因传入的token有前缀 需要删除
        token=token.replace("Bearer ","");
        //删除redis里的token 相当于退出登录
        stringRedisTemplate.delete(ConstantUtil.ADMIN_TOKEN+token);
    }
}
